package tec;

 /**
 * Cette classe realise un passager avec le caractere suivant
 *<p>
 * A la montee chercher un place assise sinon un place debout,
 * A chaque arret si la destination est attente sortir. 
 *
 * Le client declenche la montee du passager dans un transport 
 * par la methode monterDans(). Un client accède au nom du passager.
 *
 * Un passager possede un nom. Il a trois etats : dehors, assis, debout. 
 * Dans un bus, un passager est forcement soit assis, soit debout. 
 * S'il n'est ni assis, ni debout, il est forcement dehors. 
 * Quand un passager est cree, il est dans l'etat dehors.
 *
 * Un passager possede une destination (un mumero d'arret). Quand un passager 
 * arrive a son arret de destination, il sort du transport.
 *
 * Les methodes accepterPlaceAssise(), accepterPlaceDebout(), accepterSortie() 
 * changent l'etat d'un passager.
 *
 * A chaque arret, la methode nouvelArret() est appelee par un objet bus. 
 * Le passager peut choisir de changer de place ou de sortir du bus. Si le bus 
 * accepte la demande, c'est le bus declenche les modificateurs de passager 
 * (les methodes comme accepterPlaceDebout()). 
 **/
 
public class PassagerStandard extends Passager  
{
   private String nom ;
   private final int DESTINATION ;
   private EtatPassager etat ;
   
   
    /**
	* Construit un passager avec la caractere standard. Son etat est dehors.
	* 
	* @param nom - le nom du passager
    * @param destination - le numero de l'arret ou le passager sort.
    **/
   public PassagerStandard(String nom, int destination)
   {
      this.nom = nom ;
      DESTINATION = destination ;
      etat = EtatPassager.dehors;
   }


   /**
   * Change l'etat du passager en assis. Le passager est dans le bus.
   * Cette methode est appelee par un objet Bus. 
   **/
   protected void accepterPlaceAssise()
    {
	etat = EtatPassager.assis;
    }
    
    
    /**
	* Change l'etat du passager en debout. Le passager est dans le bus.
	* Cette methode est appelee par un objet Bus. 
    **/
    protected void accepterPlaceDebout()
    {
	etat = EtatPassager.debout;
    }
    
    
    /**
	* Change l'etat du passager en hors du bus. 
	* Cette methode est appelee par un objet Bus. 
    **/
    protected void accepterSortie()
    {
	etat = EtatPassager.dehors;

    }
    
    
    /**
    * Retourne vrai si le passager est assis dans le bus.
	* @return vrai si le passager est assis dans le b
    **/
    protected boolean estAssis()
    {
	return etat.estAssis() ;
    }



    /**
    * Retourne vrai si le passager est debout dans le bus.
	* @return vrai si le passager est debout dans le b
    **/    
    protected boolean estDebout()
    {
	return etat.estDebout() ;
    }
    
    
    
    /**
    * Retourne vrai si le passager est dehors dans le bus.
	* @return vrai si le passager est dehors dans le b
    **/
    protected boolean estDehors()
    {
	return !estAssis() && !estDebout() ;
    }
    



    /**
	* Fournit a un usager le transport auquel il peut acceder. Cette methode implemente le caractere du passager a la montee.
	* @param t - le transport dans lequel desire monter l'usage
    **/
    public void monterDans(Transport t)
    {
	Bus b= (Bus) t;
	b.demanderPlaceAssise(this);
    	if (!estAssis()/*etat != ASSIS*/)
	    b.demanderPlaceDebout(this);
    }



	/**
	* fournit le nom de l'usager. 
	**/
    public String nom()
    {
	return nom;
    }





	/**
	* Indique au passager qu'il est arrive a un nouvel arret. 
	* Cette methode fixe le comportement (changer de place ou sortir). 
	* Cette methode est appelee par Bus.
	* @param bus - le bus dans lequel se trouve le passager.
    * @param numeroArret - numero de l'arret.
	**/
    public void nouvelArret(Bus t, int numeroArret) 
    {
    	if(DESTINATION == numeroArret){
    		t.demanderSortie(this);
        }
    	else{
    		if(estDebout())
		    t.demanderChangerEnAssis(this);
    	}
    		
    }






  /**
   * Cette méthode est héritée de la classe {@link java.lang.Object}.
   * Très utile pour le débogage, elle permet de fournir une 
   * chaîne de caractères correspondant à l'état d'un objet.
   * <p> Un code par défaut est définit dans 
   * {@link java.lang.Object#toString() la classe Object} 
   * Il faut adapter (redéfinir) le code de cette méthode à chaque classe.
   *
   * Pour les chaînes de cararctères, l'opérateur + correspond a la concaténation. 
   */
    @Override
    public String toString()
    {
	return (nom + " " + etat).toLowerCase();
    }	
}	



 




